package top.v5it.japi.plus.common.util;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;

import java.util.function.Supplier;

/**
 * 断言
 *
 * @author zhanpu
 * @date 20-11-26
 */
public class AssertData extends Assert {

    private AssertData() {
        throw new UnsupportedOperationException();
    }

    /**
     * 为空时断言失败
     *
     * @param text             待断言数据
     * @param errorMsgTemplate 断言失败消息模板
     * @param params           消息参数
     * @param <T>              待断言数据类型
     * @return 断言成功，返回待断言数据
     * @throws IllegalArgumentException 无效参数异常
     */
    public static <T> T notBlankIfStr(T text, String errorMsgTemplate, Object... params) throws IllegalArgumentException {
        if (StrUtil.isBlankIfStr(text)) {
            throw new IllegalArgumentException(StrUtil.format(errorMsgTemplate, params));
        } else {
            return text;
        }
    }

    /**
     * 为空时断言失败
     *
     * @param text 待断言数据
     * @param <T>  待断言数据类型
     * @return 断言成功，返回待断言数据
     * @throws IllegalArgumentException 无效参数异常
     */
    public static <T> T notBlankIfStr(T text) throws IllegalArgumentException {
        return notBlankIfStr(text, "[Assertion failed] - this String argument must have text; it must not be null, empty, or blank");
    }

    /**
     * 为空时断言失败
     *
     * @param text     待断言数据
     * @param supplier 断言失败后处理函数
     * @param <T>      待断言数据类型
     * @param <X>      断言失败后异常类型
     * @return 断言成功，返回待断言数据
     * @throws X 断言失败后自定义异常类型
     */
    public static <T, X extends Throwable> T notBlankIfStr(T text, Supplier<? extends X> supplier) throws X {
        if (StrUtil.isBlankIfStr(text)) {
            throw supplier.get();
        } else {
            return text;
        }
    }

}
